Canigó - Servei d'OLE 2.2
SERVEI D'OLE
IntroduccióPropòsitEl servei de manipulació de formats OLE (Excel i Word) de canigo permet llegir, crear, modificar i mostrar documents de Microsoft amb formats basats en OLE. Context i Escenaris d'ÚsEl servei de manipulació de formats OLE es troba dins dels serveis de presentació de canigo. El seu ús és necessari en cas de voler manipular/mostrar documents amb format OLE. Versions i DependènciesLes dependències descrites a la següent url son requerides per tal de compilar i fer funcionar el projecte: A qui va dirigitAquest document va dirigit als següents perfils:
Documents i Fonts de Referència
GlossariOLE POI Descripció DetalladaArquitectura i Componentscanigo ofereix una arquitectura d'ús de manipulació de documents OLE totalment deslligada de qualsevol implementació. Els components podem classificar-los en:
Nota Es pot trobar tota la documentació JavaDoc y el codi font referent aquests components a les següents urls: JavaDoc: http://canigo.ctti.gencat.net/confluence/canigodocs/site/canigo2_0/canigo-services-ole/apidocs/index.html Instal- lació i ConfiguracióInstal- lacióLa instal- lació del servei requereix de la utilització de la llibreria 'canigo-services-ole' i les dependències indicades a l'apartat 'Introducció - Versions i Dependències'. ConfiguracióPer a configurar el servei de manipulació de formats OLE s'han d'actualitzar els següents fitxers: La configuració implica els següents pasos:
Definició Bàsica del Servei
Fitxer de configuració: web.xml Ubicació: <PROJECT_ROOT>/src/main/webapp/WEB-INF _ _En aquest punt es defineix que tota petició realitzada amb extensió '.doc' o '.xls' les resoldrà el servlet principal. Definir el següent codi:
... <servlet> <servlet-name>application</servlet-name> <servlet-class> org.springframework.web.servlet.DispatcherServlet </servlet-class> <load-on-startup>2</load-on-startup> </servlet> ... <servlet-mapping> <servlet-name>application</servlet-name> <url-pattern>*.doc</url-pattern> </servlet-mapping> <servlet-mapping> <servlet-name>application</servlet-name> <url-pattern>*.xls</url-pattern> </servlet-mapping> ...
Fitxer de configuració: canigo-services-ole.xml Ubicació: <PROJECT_ROOT>/src/main/resources/spring Definir el següent codi:
... <!- OLE service -> <bean id="oleResolver" class="org.springframework.web.servlet.view.XmlViewResolver" > <property name="location" value="classpath:spring/canigo-services-views.xml" /> </bean> ...
Fitxer de configuració: struts-config.xml Ubicació: <PROJECT_ROOT>/src/main/resources/spring Definir el següent codi:
... <global-forwards> ... <!- Forward a un objecte OLE -> <forward name="oleXLS" path="/ole.xls" redirect="true" /> <forward name="oleDOC" path="/ole.doc" redirect="true" /> ... </global-forwards> ...
Fitxer de configuració: canigo-services-ole.xml Ubicació: <PROJECT_ROOT>/src/main/resources/spring Definir el següent codi:
Fitxer de configuració: action-servlet.xml Ubicació: <PROJECT_ROOT>/src/main/resources/spring Definir el següent codi:
... <bean id="urlMapping" class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping"> ... <property name="mappings"> <props> ... <prop key="ole.xls">oleController</prop> <prop key="ole.doc">oleController</prop> </props> </property> </bean> ...<bean id="oleController"class="net.gencat.ctti.canigo.services.ole.OleController" />... Definició dels constructors dels documents OLE Fitxer de configuració: canigo-services-views.xml Ubicació: <PROJECT_ROOT>/src/main/resources/spring En aquest fitxer es defineixen els beans que renderitzen els documents amb format OLE. Cadascuna de les classes de document que extenguin de 'WrapperWordView' o 'WrapperExcelView' (veure apartat 'Utilització del Servei') seran definides en aquest apartat. Atributs:
Per cada bean es poden configurar les següents propietats:
Tant 'beanName' com 'beanList' són informacions d'ajuda a la vista per accedir a les dades que li prepari el Action. En qualsevol cas, es poden passar paràmetres entre el Action i la vista de qualsevol tipus sense definir aquestes propietats. Exemple:
<bean id="itemsWordView" class="net.gencat.ctti.canigo.samples.jpetstore.ole.views.ItemsWordView"> <property name="beanName" value="net.gencat.ctti.canigo.samples.jpetstore.model.Item"/> <property name="beanList" value="itemList"/> <property name="url" value="classpath:ole/template.doc"/> <property name="logService" ref="loggingService"/> </bean> Utilització del ServeiGeneració d'un document amb format OLEA continuació es mostren els pasos necessaris per generar un document en format OLE:
Una vegada obtinguda la informació a mostrar al document, haurem de realitzar els següents pasos:
La vista ha d'implementar el mètode 'wrappedBuildWordDocument' o 'wrappedBuildExcelDocument' segons es tracti d'una vista de Word o de Excel. En el paràmetre 'model' d'aquests mètodes, la vista pot accedir a les dades preparades per l'Action. La vista usarà els mètodes proporcionats per l'API de POI per generar el contingut.
protected void wrappedBuildWordDocument( Map model, WordDocument wordDocument, HttpServletRequest request, HttpServletResponse response) throws OleServiceException{ List list = (List)model.get(this.getBeanList()); if (logService!=null) this.logService.getLog(this.getClass()).debug("Found list?"+(list!=null)); if(list!=null) { Iterator it = list.iterator(); Range range = new Range(0, wordDocument.characterLength(), wordDocument); while(it.hasNext()){ Item item = (Item)it.next(); CharacterProperties props = new CharacterProperties(); props.setBold(true); range = range.insertAfter(" Item ID="item.getId()"\r", props); props.setBold(false); range = range.insertAfter(" Name: ",props); props.setItalic(true); range = range.insertAfter(" "+item.getAttr1()); props.setItalic(false); range = range.insertAfter(", Product: ",props); props.setItalic(true); range = range.insertAfter(" "+item.getProductid().getName(),props); props.setItalic(false); range = range.insertAfter(", Category: ",props); props.setItalic(true); range = range.insertAfter(" "item.getProductid().getCategory(). getName()"\r",props); } }
Per últim, cal recordar que la invocació funciona segons el mecanisme general d'indicació del paràmetre 'reqCode'. ExemplesGenerar un document Excel en format OLEA continuació, com exemple, es mostren les passes a seguir per generar un document Excel en format OLE. Definir el document a modelar en el servei (views.xml)
<?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "http://www.springframework.org/dtd/spring-beans.dtd"> <beans> ... <bean id="WidgetExcelExample" class="net.gencat.ctti.samples.ole.WidgetListExcelView" > <property name="beanName" value="WidgetExcelExampleBean" /> <property name="beanList" value="WidgetExcelExampleList" /> </bean> ... </beans> } Modelar les dades a mostrarEn l'Action es modelaran les dades que, posteriorment, es renderitzaran donant com a resultat el document en format OLE.
/** * Using OLE (Excel) * @param request * @param response * @return ActionForward */ public ActionForward viewOleExcel(Category vo, StrutsContext context) { // Get data for render Excel document Map model = getWidgetModel(); // Save data in session context.getRequest().getSession().setAttribute(OleController.OLE_CONTROLLER_MODEL, model); // Set view name to render context.getRequest().getSession().setAttribute(OleController. OLE_CONTROLLER_VIEWID, "WidgetExcelExample"); // Forward to OLE Controller return context.getActionMapping().findForward("oleXLS"); } private Map getWidgetModel() { Map model = new HashMap(); Collection beanData = getWidgetData(); model.put("WidgetExcelExampleList", beanData); return model; } protected List getWidgetData() { List list = new ArrayList(); for (int x = 0; x < 10; x++) { Widget bean = new Widget(); bean.setId ( x ) ; bean.setName("canigo"); bean.setSize(10*x); list.add(bean); } return list; } Renderitzar les dades a mostrarS'ha de definir una classe que renderitzi les dades a mostrar en format OLE. Aquesta classe ha d'extendre de WrapperExcelView i utilitza directament l'API de POI (HSSF per Excel i HWPF per Word) per renderitzar el document.
package net.gencat.ctti.samples.ole; /** imports */ /** * View to generate an Excel document of a list of Widgets */ public class WidgetListExcelView extends WrapperExcelView { protected static final short WIDGET_NAME_COLUMN = 0; protected static final short WIDGET_SIZE_COLUMN = 1; protected void wrappedBuildExcelDocument(Map model, HSSFWorkbook workbook,HttpServletRequest request, HttpServletResponse response) { // CREATE THE SHEET HSSFSheet sheet = workbook.createSheet("Widget List"); sheet.setDefaultColumnWidth((short) 12); // GETCELL: getCell(SHEET, ROW, COLUMN); short currentRow = 0; // WRITE ROW FOR HEADER HSSFCell header0 = getCell( sheet,currentRow,WIDGET_NAME_COLUMN); setText(header0, "NAME"); HSSFCell header1 = getCell( sheet,currentRow,WIDGET_SIZE_COLUMN); setText(header1, "SIZE"); // Get data from model with key "beanList" List widgetList = (List) model.get(*getBeanList()*); Iterator widgetListIterator = widgetList.iterator(); while (widgetListIterator.hasNext()) { currentRow++; Widget widget = (Widget) widgetListIterator.next(); HSSFRow row = sheet.createRow(currentRow); row.createCell(WIDGET_NAME_COLUMN) .setCellValue(widget.getName()); row.createCell(WIDGET_SIZE_COLUMN) .setCellValue(widget.getSize()); } } } InvocacióPer invocar la generació del fitxer Excel es seguirà el procés general de passar com a reqCode el nom del mètode de l'Action que volem executar, en aquest cas 'viewOleExcel'. |